/**
 *  @权限配置
 *
 */
import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken, removeToken } from '@/utils/auth'

import { axiosPromiseArr } from '@/utils/request'

NProgress.configure({ speed: 200, showSpinner: false })

// 路由白名单
const whiteList = ['/login']

router.beforeEach(async (to, from, next) => {
    console.log(from)
    console.log(to)
    NProgress.start()
    // 路由切换时取消所有未完成的axios请求。
    axiosPromiseArr.forEach((ele, index) => {
        ele.f()
        delete axiosPromiseArr[index]
    })
    // 强制路径进入登录页面  重置token
    if (to.path === '/login' && from.path !== '/login') {
        await store.dispatch('user/resetToken')
        next()
        return
    }
    const hasToken = getToken()
    if (hasToken) {
        // 设置token
        store.commit('user/SET_TOKEN', hasToken)
        const hasRoles = store.getters.roles && store.getters.roles.length > 0
        if (hasRoles) {
            // 验证vuex是否存在roles
            // 场景：登录后不刷新页面路由切换，刷新后roles丢失
            next()
        } else {
            // token存在，刷新页面或者token有效期内重复登录，验证token并获取权限信息
            try {
                // 获取当前用户权限即 动态路由
                // get roles
                const roles = await store.dispatch('user/getInfo')
                // get async Routes
                const accessRoutes = await store.dispatch('permission_router_server/getRoutes', { roles, to })
                // addRoutes
                router.addRoutes(accessRoutes)
                // * hack问题，就是router.addRoutes之后的next()可能会失效，因为可能next()的时候路由并没有完全add完成
                // * 所以使用next(to)避开，使得路由重新跳转进入router.beforeEach这个钩子，进入hasRoles这个判断放行
                next({ ...to, replace: true }) // replace是用来删除back历史记录，解决浏览器导航返回到登录页面
            } catch (error) {
                /**
                 * 抛出异常
                 * 判断异常来源
                 * 1.登录页 关闭loading
                 * 2.操作页 跳转登录页
                 */
                Message.error(error)
                if (from.name === 'Login') {
                    from.matched[0].instances.default.loading.login = false
                } else {
                    next('/login')
                }
                NProgress.done()
            }
        }

    } else {
        // token 不存在，可去白名单
        if (whiteList.indexOf(to.path) !== -1) {
            next()
        } else {
            // 重新定向登录页，携带to.path作为login路由query参数
            next(`/login?redirect=${ to.path }`)
            NProgress.done()
        }
    }
})

// 路由进入后 关闭进度条
router.afterEach(() => {
    NProgress.done()
})
